<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta content="Cask Data, Inc." name="author" />
<meta content="Copyright © 2016-2017 Cask Data, Inc." name="copyright" />


    <meta name="git_release" content="6.1.1">
    <meta name="git_hash" content="05fbac36f9f7aadeb44f5728cea35136dbc243e5">
    <meta name="git_timestamp" content="2020-02-09 08:22:47 +0800">
    <title>Testing Plugins</title>

    <link rel="stylesheet" href="../../_static/cdap-bootstrap.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/bootstrap-3.3.6/css/bootstrap.min.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/bootstrap-3.3.6/css/bootstrap-theme.min.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/bootstrap-sphinx.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/cdap-dynamicscrollspy-4.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/jquery.mCustomScrollbar.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/cdap-jquery.mCustomScrollbar.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/abixTreeList-2.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/cdap-bootstrap.css" type="text/css" />

    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '',
        VERSION:     '6.1.1',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  false
      };
    </script>
    <script type="text/javascript" src="../../_static/jquery.js"></script>
    <script type="text/javascript" src="../../_static/underscore.js"></script>
    <script type="text/javascript" src="../../_static/doctools.js"></script>
    <script type="text/javascript" src="../../_static/language_data.js"></script>

    <link rel="shortcut icon" href="../../_static/favicon.ico"/>
    <link rel="index" title="Index" href="../../genindex.html" />
    <link rel="search" title="Search" href="../../search.html" />
    <link rel="top" title="Cask Data Application Platform 6.1.1 Documentation" href="../../index.html" />
    <link rel="up" title="Developing Plugins" href="index.html" />
    <link rel="next" title="Packaging Plugins" href="packaging-plugins.html" />
    <link rel="prev" title="Plugin Presentation" href="presentation-plugins.html" />
    <!-- block extrahead -->
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
    <meta name="apple-mobile-web-app-capable" content="yes">
    <!-- block extrahead end -->

</head>
<body role="document">

<!-- block navbar -->
<div id="navbar" class="navbar navbar-inverse navbar-default navbar-fixed-top">
    <div class="container-fluid">
      <div class="row">
        <div class="navbar-header">
          <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
          <a class="navbar-brand" href="../../table-of-contents/../../index.html">
            <span><img alt="CDAP logo" src="../../_static/cdap_logo.svg"/></span>
          </a>

          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>

          <div class="pull-right">
            <div class="dropdown version-dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"
                role="button" aria-haspopup="true" aria-expanded="false">
                v 6.1.1 <span class="caret"></span>
              </a>
              <ul class="dropdown-menu">
                <li><a href="//docs.cdap.io/cdap/5.1.2/en/index.html">v 5.1.2</a></li>
                <li><a href="//docs.cdap.io/cdap/4.3.4/en/index.html">v 4.3.4</a></li>
              </ul>
            </div>
          </div>
          <form class="navbar-form navbar-right navbar-search" action="../../search.html" method="get">
            <div class="form-group">
              <div class="navbar-search-image material-icons"></div>
              <input type="text" name="q" class="form-control" placeholder="  Search" />
            </div>
            <input type="hidden" name="check_keywords" value="yes" />
            <input type="hidden" name="area" value="default" />
          </form>

          <div class="collapse navbar-collapse nav-collapse navbar-right navbar-navigation">
            <ul class="nav navbar-nav"><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link " href="../../table-of-contents/../../index.html">简介</a></li><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link current" href="../../table-of-contents/../../guides.html">手册</a></li><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link " href="../../table-of-contents/../../reference-manual/index.html">参考</a></li><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link " href="../../table-of-contents/../../faqs/index.html">帮助</a></li>
            </ul>
          </div>

        </div>
      </div>
    </div>
  </div><!-- block navbar end -->
<!-- block main content -->
<div class="main-container container">
  <div class="row"><div class="col-md-2">
      <div id="sidebar" class="bs-sidenav scrollable-y-outside" role="complementary">
<!-- theme_manual: developer-manual -->
<!-- theme_manual_highlight: guides -->
<!-- sidebar_title_link: ../../table-of-contents/../../guides.html -->

  <div role="note" aria-label="manuals links"><h3><a href="../../table-of-contents/../../guides.html">Guides</a></h3>

    <ul class="this-page-menu">
      <li class="toctree-l1"><a href="../../table-of-contents/../../user-guide/index.html" rel="nofollow">用户手册</a>
      </li>
      <li class="toctree-l1"><b><a href="../../table-of-contents/../../developer-manual/index.html" rel="nofollow">开发手册</a></b>
      <nav class="pagenav">
      <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../index.html"> 简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../getting-started/index.html"> 入门指南</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/sandbox/index.html">CDAP Sandbox</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../getting-started/sandbox/zip.html">二进制 Zip 文件</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../getting-started/sandbox/zip.html#cdap-sandbox">启动和停止 CDAP Sandbox</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../getting-started/sandbox/virtual-machine.html">虚拟机镜像</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../getting-started/sandbox/docker.html">Docker 镜像</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/quick-start.html">快速入门</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/dev-env.html">搭建开发环境</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/start-stop-cdap.html">启动和停止 CDAP</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/building-apps.html">构建并运行应用</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../overview/index.html"> 概述</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../overview/anatomy.html"> 大数据应用剖析</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../overview/modes.html"> 模式和组件</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../overview/abstractions.html"> 核心概念</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../overview/interfaces.html"> 编程接口</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../building-blocks/index.html"> 抽象概念</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/core.html"> Core Abstractions</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/applications.html"> Applications</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/datasets/index.html"> Datasets</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/overview.html"> Overview</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/table.html"> Table API</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/fileset.html"> FileSets</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/partitioned-fileset.html"> Partitioned FileSets</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/time-partitioned-fileset.html"> TimePartitioned FileSets</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/system-custom.html"> System and Custom Datasets</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/permissions.html"> Dataset Permissions</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/cube.html"> Cube Dataset</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/mapreduce-programs.html"> MapReduce Programs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/plugins.html"> Plugins</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/schedules.html"> Schedules</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/secure-keys.html"> Secure Keys</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/services.html"> Services</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/spark-programs.html"> Spark Programs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/workers.html"> Workers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/workflows.html"> Workflows</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/artifacts.html"> Artifacts</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/program-lifecycle.html"> Program Lifecycle</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/namespaces.html"> Namespaces</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/transaction-system.html"> Transaction System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/transactional-messaging-system.html"> Transactional Messaging System</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../metadata/index.html"> 元数据</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/system-metadata.html"> System Metadata</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/discovery-lineage.html"> Discovery and Lineage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/field-lineage.html"> Field Level Lineage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/audit-logging.html"> Audit Logging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/metadata-ui.html"> CDAP Metadata UI</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/programmatic-metadata.html"> Accessing metadata programmatically</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html"> 数据流管道</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../concepts-design.html"> Concepts and Design</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting-started.html"> Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../studio.html"> CDAP Studio</a></li>
<li class="toctree-l2"><a class="reference internal" href="../creating-pipelines.html"> Creating Pipelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../running-pipelines.html"> Running Pipelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../plugin-management.html"> Plugin Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../plugins/index.html"> Plugin Reference</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../plugins/actions/index.html"> Action Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/sources/index.html"> Source Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/transforms/index.html"> Transform Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/analytics/index.html"> Analytic Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/sinks/index.html"> Sink Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/shared-plugins/index.html"> Shared Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../plugins/shared-plugins/core.html">CoreValidator</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/post-run-plugins/index.html"> Post-run Plugins</a><ul class="simple">
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../developing-pipelines.html"> Developing Pipelines</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html"> Developing Plugins</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="plugin-basics.html">Plugin Basics</a></li>
<li class="toctree-l3"><a class="reference internal" href="creating-a-plugin.html">Creating a Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="presentation-plugins.html">Plugin Presentation</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">Testing Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="packaging-plugins.html">Packaging Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../how-cdap-pipelines-work.html"> How CDAP Pipelines Work</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../cloud-runtimes/index.html"> 云平台运行</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../cloud-runtimes/concepts/index.html"> Concepts</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../cloud-runtimes/provisioners/index.html"> Provisioners</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/provisioners/gcp-dataproc.html">Google Dataproc</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/provisioners/aws-emr.html">Amazon Elastic MapReduce</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/provisioners/remote-hadoop.html">Remote Hadoop</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../cloud-runtimes/profiles/index.html"> Profiles</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/profiles/creating-profiles.html">Creating Profiles</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/profiles/assigning-profiles.html">Assigning Profiles</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/profiles/admin-controls.html">Admin Controls</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../cloud-runtimes/example/index.html"> Example</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../security/index.html"> 安全</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../security/client-authentication.html">Client Authentication</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../security/cdap-authentication-clients-java.html">CDAP Authentication Client for Java</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../security/cdap-authentication-clients-python.html">CDAP Authentication Client for Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../security/custom-authentication.html">Custom Authentication</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../security/authorization-extensions.html">Authorization Extensions</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../testing/index.html"> 测试和调试</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../testing/testing.html"> Testing a CDAP Application</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../testing/debugging.html"> Debugging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../testing/troubleshooting.html"> Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../ingesting-tools/index.html"> 数据融合</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../ingesting-tools/cdap-stream-clients-java.html">CDAP Stream Client for Java</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../ingesting-tools/cdap-stream-clients-python.html">CDAP Stream Client for Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../ingesting-tools/cdap-stream-clients-ruby.html">CDAP Stream Client for Ruby</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../ingesting-tools/cdap-flume.html">CDAP Flume</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../data-exploration/index.html"> 数据探索</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/filesets.html"> Fileset Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/tables.html"> Table Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/object-mapped-tables.html"> ObjectMappedTable Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/custom-datasets.html"> Custom Dataset Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/hive-execution-engines.html"> Hive Execution Engines</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../advanced/index.html"> 高级主题</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/application-logback.html"> Application Logback</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/best-practices.html"> Best Practices</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/class-loading.html"> Class Loading</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/configuring-resources.html"> Configuring Program Resources</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/program-retry-policies.html"> Program Retry Policies</a></li>
</ul>
</li>
</ul>
</nav>
      </li>
      <li class="toctree-l1"><a href="../../table-of-contents/../../admin-manual/index.html" rel="nofollow">管理手册</a>
      </li>
      <li class="toctree-l1"><a href="../../table-of-contents/../../integrations/index.html" rel="nofollow">集成手册</a>
      </li>
      <li class="toctree-l1"><a href="../../table-of-contents/../../examples-manual/index.html" rel="nofollow">最佳实践</a>
      </li>
    </ul>
  </div></div>
    </div><div class="col-md-8 content" id="main-content">
    
  <div class="section" id="testing-plugins">
<span id="cdap-pipelines-testing-plugins"></span><h1>Testing Plugins<a class="headerlink" href="#testing-plugins" title="Permalink to this headline">🔗</a></h1>
<div class="section" id="test-framework-for-plugins">
<h2>Test Framework for Plugins<a class="headerlink" href="#test-framework-for-plugins" title="Permalink to this headline">🔗</a></h2>
<p>The Test Framework provides methods to create and deploy JAR files as artifacts. This lets you
test the creation of multiple applications from the same artifact, as well as the use of plugin artifacts.</p>
<p>To add an artifact containing an application class:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="c1">// Add the artifact for a Data Pipeline app</span>
<span class="n">addAppArtifact</span><span class="p">(</span><span class="k">new</span> <span class="n">ArtifactId</span><span class="p">(</span><span class="n">NamespaceId</span><span class="p">.</span><span class="na">DEFAULT</span><span class="p">.</span><span class="na">getNamespace</span><span class="p">(),</span> <span class="s">&quot;data-pipeline&quot;</span><span class="p">,</span> <span class="s">&quot;3.5.0&quot;</span><span class="p">),</span>
  <span class="n">DataPipelineApp</span><span class="p">.</span><span class="na">class</span><span class="p">,</span>
  <span class="n">BatchSource</span><span class="p">.</span><span class="na">class</span><span class="p">.</span><span class="na">getPackage</span><span class="p">().</span><span class="na">getName</span><span class="p">(),</span>
  <span class="n">Action</span><span class="p">.</span><span class="na">class</span><span class="p">.</span><span class="na">getPackage</span><span class="p">().</span><span class="na">getName</span><span class="p">(),</span>
  <span class="n">PipelineConfigurable</span><span class="p">.</span><span class="na">class</span><span class="p">.</span><span class="na">getPackage</span><span class="p">().</span><span class="na">getName</span><span class="p">(),</span>
  <span class="s">&quot;org.apache.avro.mapred&quot;</span><span class="p">,</span> <span class="s">&quot;org.apache.avro&quot;</span><span class="p">,</span> <span class="s">&quot;org.apache.avro.generic&quot;</span><span class="p">);</span>
</pre></div>
</div>
<p>The first argument is the <code class="docutils literal notranslate"><span class="pre">id</span></code> of the artifact; the second is the application class; and
the remainder of the arguments are packages that should be included in the
<code class="docutils literal notranslate"><span class="pre">Export-Packages</span></code> manifest attribute bundled in the JAR. The framework will trace the
dependencies of the specified application class to create a JAR with those dependencies.
This will mimic what happens when you actually build your application JAR using maven.</p>
<p>An application can then be deployed using that artifact:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="c1">// Create application create request</span>
<span class="n">ETLBatchConfig</span> <span class="n">etlConfig</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ETLBatchConfig</span><span class="p">(</span><span class="s">&quot;* * * * *&quot;</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="n">sink</span><span class="p">,</span> <span class="n">transformList</span><span class="p">);</span>
<span class="n">AppRequest</span><span class="o">&lt;</span><span class="n">ETLBatchConfig</span><span class="o">&gt;</span> <span class="n">appRequest</span> <span class="o">=</span> <span class="k">new</span> <span class="n">AppRequest</span><span class="o">&lt;&gt;</span><span class="p">(</span><span class="k">new</span> <span class="n">ArtifactSummary</span><span class="p">(</span><span class="s">&quot;etlbatch&quot;</span><span class="p">,</span> <span class="s">&quot;3.5.0&quot;</span><span class="p">),</span> <span class="n">etlConfig</span><span class="p">);</span>
<span class="n">ApplicationId</span> <span class="n">appId</span> <span class="o">=</span> <span class="n">NamespaceId</span><span class="p">.</span><span class="na">DEFAULT</span><span class="p">.</span><span class="na">app</span><span class="p">(</span><span class="s">&quot;KVToKV&quot;</span><span class="p">);</span>

<span class="c1">// Deploy the application</span>
<span class="n">ApplicationManager</span> <span class="n">appManager</span> <span class="o">=</span> <span class="n">deployApplication</span><span class="p">(</span><span class="n">appId</span><span class="p">,</span> <span class="n">appRequest</span><span class="p">);</span>
</pre></div>
</div>
<p>Plugins extending the artifact can also be added:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="c1">// Add some test plugins</span>
<span class="n">addPluginArtifact</span><span class="p">(</span><span class="k">new</span> <span class="n">ArtifactId</span><span class="p">(</span><span class="n">NamespaceId</span><span class="p">.</span><span class="na">DEFAULT</span><span class="p">.</span><span class="na">getNamespace</span><span class="p">(),</span> <span class="s">&quot;spark-plugins&quot;</span><span class="p">,</span> <span class="s">&quot;1.0.0&quot;</span><span class="p">),</span>
                  <span class="n">APP_ARTIFACT_ID</span><span class="p">,</span>
                  <span class="n">NaiveBayesTrainer</span><span class="p">.</span><span class="na">class</span><span class="p">,</span> <span class="n">NaiveBayesClassifier</span><span class="p">.</span><span class="na">class</span><span class="p">);</span>
</pre></div>
</div>
<p>The first argument is the <code class="docutils literal notranslate"><span class="pre">id</span></code> of the plugin artifact; the second is the parent artifact
it is extending; and the remainder of the arguments are classes that should be bundled in
the JAR. The packages of all these classes are included in the <code class="docutils literal notranslate"><span class="pre">Export-Packages</span></code>
manifest attribute bundled in the JAR. When adding a plugin artifact this way, it is
important to include all classes in your plugin packages, even if they are not used in
your test case. This is to ensure that the JAR can trace all required dependencies to
correctly build the JAR.</p>
<p>The examples are taken from the <code class="docutils literal notranslate"><span class="pre">DataPipelineTest</span></code> and <code class="docutils literal notranslate"><span class="pre">HydratorTestBase</span></code> classes of CDAP pipelines.</p>
</div>
<div class="section" id="cdap-pipelines-test-module">
<h2>CDAP Pipelines Test Module<a class="headerlink" href="#cdap-pipelines-test-module" title="Permalink to this headline">🔗</a></h2>
<p>Additional information on unit testing with CDAP is in the 开发手册 section
on <a class="reference internal" href="../../testing/testing.html#test-framework"><span class="std std-ref">Testing a CDAP Application</span></a>.</p>
<p>In addition, CDAP provides a <code class="docutils literal notranslate"><span class="pre">hydrator-test</span></code> module that contains several mock plugins
for you to use in tests with your custom plugins. To use the module, add a dependency to
your <code class="docutils literal notranslate"><span class="pre">pom.xml</span></code>:</p>
<div class="highlight-xml notranslate"><div class="highlight"><pre><span></span><span class="nt">&lt;dependency&gt;</span>
  <span class="nt">&lt;groupId&gt;</span>io.cdap.cdap<span class="nt">&lt;/groupId&gt;</span>
  <span class="nt">&lt;artifactId&gt;</span>hydrator-test<span class="nt">&lt;/artifactId&gt;</span>
  <span class="nt">&lt;version&gt;</span>${cdap.version}<span class="nt">&lt;/version&gt;</span>
  <span class="nt">&lt;scope&gt;</span>test<span class="nt">&lt;/scope&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
</pre></div>
</div>
<p>Then extend the <code class="docutils literal notranslate"><span class="pre">HydratorTestBase</span></code> class, and create a method that will setup up the
application artifact and mock plugins, as well as the artifact containing your custom plugins:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="cm">/**</span>
<span class="cm"> * Unit tests for our plugins.</span>
<span class="cm"> */</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">PipelineTest</span> <span class="kd">extends</span> <span class="n">HydratorTestBase</span> <span class="p">{</span>
  <span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">ArtifactSummary</span> <span class="n">APP_ARTIFACT</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArtifactSummary</span><span class="p">(</span><span class="s">&quot;cdap-data-pipeline&quot;</span><span class="p">,</span> <span class="s">&quot;1.0.0&quot;</span><span class="p">);</span>
  <span class="nd">@ClassRule</span>
  <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">TestConfiguration</span> <span class="n">CONFIG</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TestConfiguration</span><span class="p">(</span><span class="s">&quot;explore.enabled&quot;</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>

  <span class="nd">@BeforeClass</span>
  <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">setupTestClass</span><span class="p">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="p">{</span>
    <span class="n">ArtifactId</span> <span class="n">parentArtifact</span> <span class="o">=</span> <span class="n">NamespaceId</span><span class="p">.</span><span class="na">DEFAULT</span><span class="p">.</span><span class="na">artifact</span><span class="p">(</span><span class="n">APP_ARTIFACT</span><span class="p">.</span><span class="na">getName</span><span class="p">(),</span> <span class="n">APP_ARTIFACT</span><span class="p">.</span><span class="na">getVersion</span><span class="p">());</span>

    <span class="c1">// Add the data pipeline artifact and mock plugins.</span>
    <span class="n">setupBatchArtifacts</span><span class="p">(</span><span class="n">parentArtifact</span><span class="p">,</span> <span class="n">DataPipelineApp</span><span class="p">.</span><span class="na">class</span><span class="p">);</span>

    <span class="c1">// Add our plugins artifact with the data pipeline artifact as its parent.</span>
    <span class="c1">// This will make our plugins available to the data pipeline.</span>
    <span class="n">addPluginArtifact</span><span class="p">(</span><span class="n">NamespaceId</span><span class="p">.</span><span class="na">DEFAULT</span><span class="p">.</span><span class="na">artifact</span><span class="p">(</span><span class="s">&quot;example-plugins&quot;</span><span class="p">,</span> <span class="s">&quot;1.0.0&quot;</span><span class="p">),</span>
                      <span class="n">parentArtifact</span><span class="p">,</span>
                      <span class="n">TextFileSetSource</span><span class="p">.</span><span class="na">class</span><span class="p">,</span>
                      <span class="n">TextFileSetSink</span><span class="p">.</span><span class="na">class</span><span class="p">,</span>
                      <span class="n">WordCountAggregator</span><span class="p">.</span><span class="na">class</span><span class="p">,</span>
                      <span class="n">WordCountCompute</span><span class="p">.</span><span class="na">class</span><span class="p">,</span>
                      <span class="n">WordCountSink</span><span class="p">.</span><span class="na">class</span><span class="p">);</span>
  <span class="p">}</span>
</pre></div>
</div>
<p>You can then add test cases as you see fit. The <code class="docutils literal notranslate"><span class="pre">cdap-data-pipeline-plugins-archetype</span></code>
includes an example of this unit test.</p>
</div>
</div>

</div>
    <div class="col-md-2">
      <div id="right-sidebar" class="bs-sidenav scrollable-y" role="complementary">
        <div id="localtoc-scrollspy">
        </div>
      </div>
    </div></div>
</div>
<!-- block main content end -->
<!-- block footer -->
<footer class="footer">
      <div class="container">
        <div class="row">
          <div class="col-md-2 footer-left"><a title="Plugin Presentation" href="presentation-plugins.html" />Previous</a></div>
          <div class="col-md-8 footer-center"><a class="footer-tab-link" href="../../table-of-contents/../../reference-manual/licenses/index.html">Copyright</a> &copy; 2014-2020 Cask Data, Inc.&bull; <a class="footer-tab-link" href="//docs.cask.co/cdap/6.1.1/cdap-docs-6.1.1-web.zip" rel="nofollow">Download</a> an archive or
<a class="footer-tab-link" href="//docs.cask.co/cdap">switch the version</a> of the documentation
          </div>
          <div class="col-md-2 footer-right"><a title="Packaging Plugins" href="packaging-plugins.html" />Next</a></div>
        </div>
      </div>
    </footer>
<!-- block footer end -->
<script type="text/javascript" src="../../_static/bootstrap-3.3.6/js/bootstrap.min.js"></script><script type="text/javascript" src="../../_static/js/bootstrap-sphinx.js"></script><script type="text/javascript" src="../../_static/js/abixTreeList-2.js"></script><script type="text/javascript" src="../../_static/js/cdap-dynamicscrollspy-4.js"></script><script type="text/javascript" src="../../_static/js/cdap-version-menu.js"></script><script type="text/javascript" src="../../_static/js/copy-to-clipboard.js"></script><script type="text/javascript" src="../../_static/js/jquery.mousewheel.min.js"></script><script type="text/javascript" src="../../_static/js/jquery.mCustomScrollbar.js"></script><script type="text/javascript" src="../../_static/js/js.cookie.js"></script><script type="text/javascript" src="../../_static/js/tabbed-parsed-literal-0.2.js"></script><script type="text/javascript" src="../../_static/js/cdap-onload-javascript.js"></script><script type="text/javascript" src="../../_static/js/cdap-version-menu.js"></script>
    <script src="https://cdap.gitee.io/docs/cdap/json-versions.js"/></script>
  </body>
</html>